#!/usr/bin/env python
# coding: utf-8

# In[2]:


import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score

# 读取文件
excel_file = pd.ExcelFile('Downloads/信用卡精准营销模型.xlsx')

# 获取所有表名
sheet_names = excel_file.sheet_names
print(sheet_names)

# 获取指定工作表中的数据
df = excel_file.parse('Sheet1')

# 查看数据的基本信息
print('数据基本信息：')
df.info()

# 查看数据集行数和列数
rows, columns = df.shape

if rows < 100 and columns < 20:
    # 短表数据（行数少于100且列数少于20）查看全量数据信息
    print('数据全部内容信息：')
    print(df.to_csv(sep='\t', na_rep='nan'))
else:
    # 长表数据查看数据前几行信息
    print('数据前几行内容信息：')
    print(df.head().to_csv(sep='\t', na_rep='nan'))

# 设置图片清晰度
plt.rcParams['figure.dpi'] = 300

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['WenQuanYi Zen Hei']

# 绘制各字段的箱线图
df.drop(columns=['响应']).plot(kind='box', subplots=True, layout=(1, 5), figsize=(15, 5))
plt.suptitle('各字段箱线图')
plt.show()

# 查看各字段的描述性统计结果，保留两位小数
result = df.drop(columns=['响应']).describe().round(2)
print('各字段的描述性统计结果：\n', result)

# 计算相关系数矩阵，保留两位小数
correlation_matrix = df.corr().round(2)

# 绘制热力图
plt.figure(figsize=(8, 6))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.title('特征相关性热力图')
plt.show()

# 查看相关系数矩阵
print('特征相关系数矩阵：\n', correlation_matrix)

# 选择特征和目标变量
X = df.drop(columns=['响应'])
y = df['响应']

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 初始化逻辑回归模型
model = LogisticRegression()

# 拟合模型
model.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = model.predict(X_test)
y_pred_proba = model.predict_proba(X_test)[:, 1]

# 计算评估指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
roc_auc = roc_auc_score(y_test, y_pred_proba)

# 输出评估指标，保留两位小数
print('准确率：', round(accuracy, 2))
print('精确率：', round(precision, 2))
print('召回率：', round(recall, 2))
print('F1 分数：', round(f1, 2))
print('ROC-AUC 分数：', round(roc_auc, 2))
    


# In[ ]:




